package br.com.velp.sudecap.hibernate.intercept;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import org.hibernate.SessionFactory;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.internal.SessionFactoryImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * <sumario>
 * <objetivo> "Rastreabilidade" </objetivo>
 * <autor> EDUARDO SANTOS DE OLIVEIRA </autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 31.03.2013 </data_criacao>
 * <data_ultima_alteracao> 17.05.2013 </data_ultima_alteracao>
 * <descricao> Classe Responsável Por Configurar Os Listeners Que Interceptarão
 *             as Operações de INSERT | UPDATE | DELETE do Hibernate, Para Efetuar
 *             os Registros de LOG de Auditoria do Sistema </descricao>
 * </sumario>
 */
@Component
public class HibernateEventWiring implements Serializable {
    
    public static final Long serialVersionUID = 1l;
    
    @Autowired
    private SessionFactory sessionFactory;    

    @Autowired
    private CustomPostDeleteEventListener postDeleteListener;
    
    @Autowired
    private CustomPostInsertEventListener postInsertListener;
    
    @Autowired
    private CustomPostUpdateEventListener postUpdateListener;

    @Autowired
    private CustomPreInsertEventListener preInsertListener;
    
    @Autowired
    private CustomPreUpdateEventListener preUpdateListener;
    
    //Registrando os Listeners da Aplicação Responsáveis Pela Geração
    //dos Registros de LOG das Operações de INSERT | UPDATE | DELETE
    //e Também Para Remoção das Acentuações das Strings Antes de 
    //Realizar INSERT | UPDATE
    @PostConstruct
    public void registerListeners() {
        
        EventListenerRegistry registry = ((SessionFactoryImpl) this.sessionFactory).getServiceRegistry().getService(EventListenerRegistry.class);
        
        registry.getEventListenerGroup(EventType.POST_DELETE).appendListener(this.postDeleteListener);
        registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(this.postInsertListener);
        registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(this.postUpdateListener);
        registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(this.preInsertListener);
        registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener(this.preUpdateListener);
        
    }
    
}